/*
 * 09结构体和函数.c
 *
 *  Created on: 2024年3月16日
 *      Author: HP
 */
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>

typedef struct student ss;
typedef struct student2 ss2;

struct student {
	char name[21];
	int age;
	int score;
	char addr[51];
};

void fun090901(ss stu){
	strcpy(stu.name, "卢俊义");
	printf("fun090901%s\n", stu.name); // 卢俊义
}

int main0909(){
	ss stu = {"松江", 50, 101, "水泊梁山"};
	fun090901(stu);
	printf("%s\n", stu.name); // 松江
	return 0;
}

struct student2 {
	char* name;
	int age;
	int score;
	char addr[51];
};

void fun090902(ss2 stu){
	// 这里修改会影响形参，如果不想改变，可以stu.name = malloc(...)再分配一块空间
	strcpy(stu.name, "卢俊义");
	printf("fun090902%s\n", stu.name); // 卢俊义
}

int main090902(){
	ss2 stu = {NULL, 50, 101, "水泊梁山"};
	stu.name = (char*)malloc(sizeof(char)*21);
	strcpy(stu.name, "松江");
	fun090902(stu);
	printf("%s\n", stu.name); // 卢俊义
	return 0;
}

void fun090903(ss* p){
	strcpy(p->name, "公孙胜");
	printf("fun090903%s\n", p->name); // 公孙胜
}

int main090903(){
	// 结构体指针作为函数参数传递
	ss stu = {"吴用", 50, 101, "水泊梁山"};
	fun090903(&stu);
	printf("%s\n", stu.name); // 公孙胜
}

// 数组作为函数参数退化为指针，会丢失元素精度，所以要传递len
void BubbleSort0909(ss stu[3], int len){
	// printf("%d\n", sizeof(stu)); // 8
	for(int i=0; i<3; i++){
		for(int j=0; j<len-i-1; j++){
			if((stu+j)->age>(stu+j+1)->age){
				ss temp = *(stu+j);
				*(stu+j) = *(stu+j+1);
				*(stu+j+1) = temp;
			}
		}
	}
}

int main090904(){
	ss stu[3] = {
		{"鲁智深", 30, 33, "五台山"},
		{"呼延灼", 45, 44, "汴京"},
		{"顾大嫂", 28, 33, "汴京"}
	};
	BubbleSort0909(stu, 3);
	for(int i=0; i<3; i++){
		printf("%s\n", stu[i].name);
		printf("%d\n", stu[i].age);
		printf("%d\n", stu[i].score);
		printf("%s\n", stu[i].addr);
	}
}
